# coding=utf-8
class Employee(object):
    '''
    所有员工的基类
    NOTE：通常你需要在单独的文件中定义一个类，养成良好的习惯
    '''
    # empCount变量是一个类变量，它的值将在这个类的所有实例之间共享。你可以在内部类或外部类使用Employee.empCount访问
    empCount = 0

    # __init__()方法是一种特殊的方法，被称为类的构造函数或初始化方法，当创建了这个类的实例时就会调用该方法
    # self代表类的实例，self 在定义类的方法时是必须有的，虽然在调用时不必传入相应的参数。
    # self不是python关键字，我们把他换成hy也是可以正常执行的
    def __init__(self, name, salary):
        self.name = name
        self.salary = salary
        Employee.empCount += 1

    def display_count(self):
        print("Total Employee %d" % Employee.empCount)

    def display_employee(hy):  # self只是别名,可以用hy等其他占位符表示
        print("Name : ", hy.name, ", Salary: ", hy.salary)

    def __str__(self):  # 自定义对象打印输出
        return 'name:{},salary:{},empCount:{}'.format(self.name, self.salary, self.empCount)

    def __del__(self):  # 析构函数 __del__,当对象不再被使用时，__del__方法运行
        class_name = self.__class__.__name__
        print(class_name, "destroyed")


em1 = Employee('a', 1.1)
em1.display_count()
em1.display_employee()
print(em1)
em2 = Employee('b', 0.1)
em2.display_count()
em2.display_employee()

em1.age = 1  # 动态添加属性,不建议动态设置,会造成代码混乱
print(dir(em1))
# del em1.age  # 动态删除属性
# print(dir(em1))

'''
可以使用以下函数的方式来操作属性：
getattr(obj, name[, default]) : 访问对象的属性。
hasattr(obj,name) : 检查是否存在一个属性。
setattr(obj,name,value) : 设置一个属性。如果属性不存在，会创建一个新属性。
delattr(obj, name) : 删除属性。
'''
print(getattr(em1, 'age'), em1.age)
print(hasattr(em1, 'age'), hasattr(em2, 'age'))
setattr(em2, 'age', 4)
print(em2, em2.age)
delattr(em2, 'age')

'''
Python内置类属性
__dict__ : 类的属性（包含一个字典，由类的数据属性组成）
__doc__ :类的文档字符串
__name__: 类名
__module__: 类定义所在的模块（类的全名是'__main__.className'，如果类位于一个导入模块mymod中，那么className.__module__ 等于 mymod）
__bases__ : 类的所有父类构成元素（包含了以个由所有父类组成的元组）
__str__ : 类的实例打印显示方式
'''

print("Employee.__doc__:", Employee.__doc__)
print("Employee.__name__:", Employee.__name__)
print("Employee.__module__:", Employee.__module__)
print("Employee.__bases__:", Employee.__bases__)
print("Employee.__dict__:", Employee.__dict__)
print("Employee.__str__:", Employee.__str__)
# print("Employee.__del__:", Employee.__del__)

em1 = Employee('need to del', 1)
em2 = em1
em3 = em1
print(id(em1), id(em2), id(em3))  # 打印对象的id
del em1
del em2
del em3

# 对象销毁(垃圾回收) 计数器
em = Employee('d', 4.4)  # 创建对象  <40>
b = em  # 增加引用， <40> 的计数
c = [b]  # 增加引用.  <40> 的计数

# print(id(em), id(b), id(c[0]))
del em  # 减少引用 <40> 的计数
b = 100  # 减少引用 <40> 的计数
c[0] = -1  # 减少引用 <40> 的计数
